/*****************************************************************************
 * This file is part of the Prolog Development Tool (PDT)
 * 
 * Author: Lukas Degener (among others) 
 * E-mail: degenerl@cs.uni-bonn.de
 * WWW: http://roots.iai.uni-bonn.de/research/pdt 
 * Copyright (C): 2004-2006, CS Dept. III, University of Bonn
 * 
 * All rights reserved. This program is  made available under the terms 
 * of the Eclipse Public License v1.0 which accompanies this distribution, 
 * and is available at http://www.eclipse.org/legal/epl-v10.html
 * 
 * In addition, you may at your option use, modify and redistribute any
 * part of this program under the terms of the GNU Lesser General Public
 * License (LGPL), version 2.1 or, at your option, any later version of the
 * same license, as long as
 * 
 * 1) The program part in question does not depend, either directly or
 *   indirectly, on parts of the Eclipse framework and
 *   
 * 2) the program part in question does not include files that contain or
 *   are derived from third-party work and are therefor covered by special
 *   license agreements.
 *   
 * You should have received a copy of the GNU Lesser General Public License
 * along with this program; if not, write to the Free Software Foundation,
 * Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
 *   
 * ad 1: A program part is said to "depend, either directly or indirectly,
 *   on parts of the Eclipse framework", if it cannot be compiled or cannot
 *   be run without the help or presence of some part of the Eclipse
 *   framework. All java classes in packages containing the "pdt" package
 *   fragment in their name fall into this category.
 *   
 * ad 2: "Third-party code" means any code that was originaly written as
 *   part of a project other than the PDT. Files that contain or are based on
 *   such code contain a notice telling you so, and telling you the
 *   particular conditions under which they may be used, modified and/or
 *   distributed.
 ****************************************************************************/

/*
 */
package org.cs3.pl.parser;

import java.util.Iterator;
import java.util.Vector;

import org.cs3.pl.common.Debug;

/**
 */
public class StringLineBreakInfoProvider implements LineBreakInfoProvider {
    Vector lineBreaks = new Vector();
    private String nl;

    public StringLineBreakInfoProvider(String text,String nl) {

        this.nl = nl;
        int offset = text.indexOf(nl);
        while (offset >= 0 && offset <= text.length()) {
            lineBreaks.add(new Integer(offset));
            offset = text.indexOf(nl, offset +nl.length());
        }
    }

    /**
     * @param text
     */
    public StringLineBreakInfoProvider(String text) {
        //this(text,System.getProperty("line.separator"));
    	this(text,"\n");
    }

    /*
     * (non-Javadoc)
     * 
     * @see org.cs3.pl.parser.LineBreakInfoProvider#getOffsetAtLine(int)
     */
    public int getOffsetAtLine(int line) {
        try{
        	return line == 0 ? 0 : ((Integer) lineBreaks.get(line - 1)).intValue()+nl.length();
        }
        catch(ArrayIndexOutOfBoundsException e){
        	Debug.error("AaaaAAAAaaaaAAAAaaaAAAaaargh.");
        	throw e;
        }
    }

    public int getLineAtOffset(int offset){
    	int r=0;
    	for (Iterator it = lineBreaks.iterator(); it.hasNext();) {
			Integer i = (Integer) it.next();
			if(i.intValue()<offset){
				r++;
			}else{
				break;
			}
		}
    	return r;
    }
    
    /*
     * (non-Javadoc)
     * 
     * @see org.cs3.pl.parser.LineBreakInfoProvider#getLineCount()
     */
    public int getLineCount() {
        return lineBreaks.size();
    }

}